package com.itheima.dubbo.service;

import com.itheima.dubbo.User;
import com.itheima.dubbo.UserFace;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.rpc.RpcContext;

/*注解优先级高于配置文件
同级别消费方高于提供方
方法级别优先级最高
@DubboReference(timeout = 500)
@DubboReference(methods={
          @Method(name="findById",timeout = 10,retries = 0),
          @Method(name = "hello",timeout = 10000)
})*/
/*@DubboService(retries = 0) 0: 表示不重试 默认重试两次
幂等性:无论发送多少次相同的请求,结果是一致的
 GET DELETE PUT(表单发起修改 幂等) POST(非幂等)
    结论:dubbo的远程调用过程中,对于非幂等操作,建议不重试
        幂等性操作建议次数不要过多,最好默认*/
/*
 * 灰度发布:
 * 一部分用户访问升级版本服务,根据反馈优化,再放入一部分用户
 * @DubboService(version = "1.0.0")注解
 * @DubboService(version = "${dubbo.application.version}")配置文件
 * */
/*
 * 上下文信息:RpcContext 是ThreadLocal的临时状态激励器 当接收或发起RPC请求
 *          RpcContext会记录最近一次信息
 * */
/*
 * 显示参数: 方法中传入的参数
 * 隐式参数: 接口已经定义完成,但还需要额外参数,这时就可以使用dubbo的隐式传参
 *       隐式传参基于RpcContext 实现
 * */
/*
 * 高可用:衡量系统的稳定性的一个指标,停机时间越少,高可用性越高
 * (行内追求:5个9(99.999%)一年停机时间为5.256分钟)
 * 提升高可用的措施:集群 容错
 *   集群:
 *       集群负载均衡策略:提供多种均衡策略 缺省为 (默认)random 随机调用(伪随机)
 *          随机(按权重设置随机概率)
 *          轮询(按公约后的权重设置轮询比率)
 *          最少活跃调用数(能者多劳)
 *          一致性(相同参数的请求总是发到同一提供者,当某提供者挂时,平摊到其他提供者)
 *              Feign 集群默认负载均衡策略:轮询
 *              Dubbo: 加权随机 @DubboService(weight = 100)默认100
 *          @DubboReference(loadbalance = "roundrobin")(加权轮询)
 *   容错:6种
 *       失败自动切换
 *       失败安全
 *       失败自动恢复
 *       并行调用多个服务器
 *       广播调用所有提供者
 *          @DubboReference(cluster = "failfast",retries=4)(集群容错)
 *
 *    服务降级:
 *      mock=force:return+null 返回null,不发起远程调用
 *      mock=fail:return+null  调用失败后返回null
 * */
/*
 * nacos宕机,服务调用是否还能成功?
 *       生产环境下:不影响服务使用
 *       开发或者测试环境下:服务在频繁的变化,,nacos不能及时更新服务,导致服务不可用
 * dubbo直连:@DubboReference(url="192.168.1.13:20880")(了解)
 *   服务提供方ip地址和dubbo端口号
 * */
/*
 * 注册中心能不能替换,如果可以用什么替换,为什么
 * 可以用redis替换,因为redis也具有发布订阅的功能
 *   redis的数据结构:HASH (Hash 大key:当前服务的权限定类名+类型
 *                       Map key : 服务ID
 *                       Map value : 过期时间)
 * */
@DubboService

public class UserFaceimpl implements UserFace {
    @Override
    public String hello(String userName) {
        return "Hello Dubbo userName:" + userName;
    }

    @Override
    public User findById(User user) {
//        RpcContext context = RpcContext.getContext();
//        String it = context.getAttachment("it");
        String it = RpcContext.getContext().getAttachment("it");
        System.out.println("it = " + it);
        return new User(user.getId(), user.getName() + "_itheima");
    }
}
